var randomstring = require('randomstring');
var crypto = require('crypto');
var convert = require('xml-js')
var querystring = require('querystring');
var config = require('./../config');
exports.getId = () => {
  var num = "";   //定义编号
  for (var i = 0; i < 4; i++) { //4位随机数，用以加在时间戳后面。
    num += Math.floor(Math.random() * 10);
  }
  var orderid = new Date().getTime() + num;  //时间戳，用来生成用户编号。
  return orderid
}
exports.getNoncestr = () => {
  return randomstring.generate(32)
}

exports.getSign = (_prepay) => {
  // 设所有发送或者接收到的数据为集合M，将集合M内非空参数值的参数按照参数名ASCII码从小到大排序（字典序），使用URL键值对的格式（即key1=value1&key2=value2…）拼接成字符串stringA。
  // 字典排序，归并操作
  const _orderedPrepay = Object.keys(_prepay).sort().reduce((obj, key) => {
    obj[key] = _prepay[key]
    return obj
  }, {})

  // 拼接字符串 - 注意url地址不编码 引入 querystring
  const stringA = querystring.stringify(_orderedPrepay, null, null, {
    encodeURIComponent: (value) => {
      return decodeURIComponent(value)
    }
  })
  // 在stringA最后拼接上key得到stringSignTemp字符串，并对stringSignTemp进行MD5运算，再将得到的字符串所有字符转换为大写，得到sign值signValue。
  // 拼接API密钥
  const stringSignTemp = stringA + "&key=" + config.key

   // 加密  - md5 - 16进制
   const signValue = crypto.createHash('md5').update(stringSignTemp).digest('hex').toUpperCase()
  return signValue
}

exports.genXml = (_prepay, sign) => {
  // 拼接数据对象 - 生成9个参数
  const dataObj = {
    xml: { // 为后续翻译xml做准备
      ..._prepay,
    sign
    }
  }
  // 转成xml 先安装convert，内含js转xml文件 cnpm i convert -S
  const xmlBody = convert.js2xml(dataObj, {
    compact: true
  })

  return xmlBody
}

exports.xml2js = (xml) => {
  let orderJS = convert.xml2js(xml, {
    compact: true,
    textKey: 'value',
    cdataKey: 'value'
  })

  let prepayObj = Object.keys(orderJS.xml).sort().reduce((obj, key) => {
    obj[key] = orderJS.xml[key]['value']
    return obj
  }, {})
  return  prepayObj
}